package com.proyectodesarrollo.semilleros.ejb;

import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import edu.eam.proyectodesarrollojpa.entidades.AccionCrudEnum;
import edu.eam.proyectodesarrollojpa.entidades.ActividadIntegrante;
import edu.eam.proyectodesarrollojpa.entidades.AsistenciaReunion;
import edu.eam.proyectodesarrollojpa.entidades.GrupoInvestigacion;
import edu.eam.proyectodesarrollojpa.entidades.Integrantes;
import edu.eam.proyectodesarrollojpa.entidades.LideresSemillero;
import edu.eam.proyectodesarrollojpa.entidades.LineaInvestigacion;
import edu.eam.proyectodesarrollojpa.entidades.MotivosReunion;
import edu.eam.proyectodesarrollojpa.entidades.Profesor;
import edu.eam.proyectodesarrollojpa.entidades.Reunion;
import edu.eam.proyectodesarrollojpa.entidades.Semillero;
import edu.eam.proyectodesarrollojpa.entidades.TareasActividad;

@Stateless
public class SemillerosBean implements SemillerosLocal,SemillerosRemote {

	@PersistenceContext(unitName="ProyectoDesarrollo_JPA")
	public EntityManager em;
	/***
	 * Metodo encargado de registrar un semillero
	 * Caso de uso  UC-0001 Registrar reunion
	 */
	public void registrarReunion(Reunion reunion,List<Integrantes> integrantes,String motivoReunion) {
		
		if(reunion!=null){
			em.persist(reunion);
			
			MotivosReunion motivo=new MotivosReunion();
			motivo.setDescripcion(motivoReunion);
			motivo.setReunion(reunion);
			em.persist(motivo);
			
			//recorro los integrantes e inserto la asistencia
			for(Integrantes integrante:integrantes){
				AsistenciaReunion asistencia=new AsistenciaReunion();
				asistencia.setIntegrante(integrante);
				asistencia.setReunion(reunion);
				em.persist(asistencia);
			}
		}
	}
	
	/**
	 * Metodo encargado de almacenar la actividad de un integrante
	 * Caso de uso  UC-0001 Almacenar actividad
	 */
	public void almacenarActividad(Integrantes integrante,Date fechaEntrega){
		
		ActividadIntegrante actividad=new ActividadIntegrante();
		actividad.setIntegrante(integrante);
		actividad.setFechaEntrega(fechaEntrega);
		em.persist(actividad);
	}
	

	/**
	 * Metodo encargado de registras las diferentes tareas de una actividad
	 */
	public void ingresarTareasActividad(List<String> tareas,ActividadIntegrante actividad){
		
		//recorro las tareas que se van a registrar
		for(String tarea:tareas){
			TareasActividad tareasActividad=new TareasActividad();
			tareasActividad.setActividad(actividad);
			tareasActividad.setDescripcion(tarea);
			em.persist(tareasActividad);
		}
		
	}
	
	/**
	 * Metodo encargado de hacer el crud de los grupos de investgación
	 * 
	 */
	public GrupoInvestigacion crudGrupoInvestigacion(GrupoInvestigacion grupoInvestigacion,AccionCrudEnum accion){
		
		if(grupoInvestigacion!=null){
			//Verifico la accion
			if(AccionCrudEnum.CREAR.equals(accion)){
				em.persist(grupoInvestigacion);
			}else if(AccionCrudEnum.MODIFICAR.equals(accion)){
				em.merge(grupoInvestigacion);
			}else if(AccionCrudEnum.ELIMINAR.equals(accion)){
				em.remove(grupoInvestigacion);
			}else{
				//Busco el grupo y lo retorno
				return em.find(GrupoInvestigacion.class, grupoInvestigacion.getIdGrupo());
			}
		}

		return null;
	}
	
	/**
	 * Metodo encargado de hacer el crud de las lineas de investigación
	 * 
	 */
	public LineaInvestigacion crudLineaInvestigacion(LineaInvestigacion Lineainvestigacion,AccionCrudEnum accion){
		
		if(Lineainvestigacion!=null){
			//Verifico la accion
			if(AccionCrudEnum.CREAR.equals(accion)){
				em.persist(Lineainvestigacion);
			}else if(AccionCrudEnum.MODIFICAR.equals(accion)){
				em.merge(Lineainvestigacion);
			}else if(AccionCrudEnum.ELIMINAR.equals(accion)){
				em.remove(Lineainvestigacion);
			}else{
				//Busco el grupo y lo retorno
				return em.find(LineaInvestigacion.class, Lineainvestigacion.getIdLinea());
			}
		}

		return null;
	}
	
	/**
	 * Metodo encargado de hacer el crud de los lideres del semillero
	 * 
	 */
	public LideresSemillero crudLiderSemillero(LideresSemillero liderSemillero,AccionCrudEnum accion){
		
		if(liderSemillero!=null){
			//Verifico la accion
			if(AccionCrudEnum.CREAR.equals(accion)){
				em.persist(liderSemillero);
			}else if(AccionCrudEnum.MODIFICAR.equals(accion)){
				em.merge(liderSemillero);
			}else if(AccionCrudEnum.ELIMINAR.equals(accion)){
				em.remove(liderSemillero);
			}else{
				//Busco el grupo y lo retorno
				return em.find(LideresSemillero.class, liderSemillero.getIdLider());
			}
		}

		return null;
	}
	
	/**
	 * Metodo encargado de consultar un profesor
	 * 
	 */
	public Profesor consultarProfesor(String cedulaProfesor){
		
		return em.find(Profesor.class, cedulaProfesor);
	}
	
	/**
	 * Metodo encargado de consultar los semilleros
	 * @return semilleros
	 */
	@SuppressWarnings("unchecked")
	public List<Semillero> consultarSemilleros(){

		return em.createQuery("Select s from Semillero").getResultList();
	}
}
